package com.kingyun.gpsinspection.purificationservice.facade.service.iam.accessory;


import com.kingyun.gpsinspection.purificationservice.facade.model.iam.ProcessBean;

import java.util.List;

/**
 * @version V1.0
 * @Package com.cqhilink.iot.integratedapplicationmanagement.facade.service.accessory
 * @Description: ${TODO}(IBMBPM 调用接口)
 * @author: lutianbo
 * @date: 2017/4/14,0014
 */

public interface BPMService {

    /**
     * 开启流程
     *
     * @param url           api的访问url
     * @param bpdId         BPD 标识:以25开头
     * @param snapshotId    Snapshot 标识:以2064开头
     * @param branchId      分支标识::以2063开头
     * @param processAppId  流程应用程序标识:以2066开头
     * @param requestMethod 请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username      用户名
     * @param password      密码
     * @param parameter     参数
     * @return
     */
    String openBPM(String url, String bpdId, String snapshotId, String branchId, String processAppId, String requestMethod, String username, String password, String parameter);

    /**
     * 开启流程
     * 请求：https://192.168.0.200:9443/rest/bpm/wle/v1/process?action=start&bpdId=25.b90b53fd-af89-4016-8eb1-f8de0bf994a9&snapshotId=2064.97ca58c9-1347-4364-ba33-b62e01297f6e&processAppId=2066.8595eceb-25b9-4234-842f-b6fd56ef6c79&parts=all
     * 方法： POST
     *
     * @param type      流程类型 0 请假 1出差 2 用车
     * @param username  用户名
     * @param password  密码
     * @param parameter 参数
     * @return
     */
    String openBPM(Integer type, String username, String password, String parameter);

    /**
     * 根据任务类型查询任务最新版本的对象
     *
     * @param taskType
     * @param username
     * @param password
     * @return
     */
    ProcessBean queryLatestVersion(Integer taskType, String username, String password);
    /**
     * 遍历list，获得指定程序和流程的最新版本
     *
     * @param taskType
     * @param list
     * @return
     */
     ProcessBean queryLatestVersion(Integer taskType, List<ProcessBean> list);

    /**
     * 获取版本创建时间最大的bean
     *
     * @param list
     * @return
     */
    ProcessBean getMaxBean(List<ProcessBean> list);

    /**
     * 查询公开的流程
     * 请求： https://192.168.0.200:9443/rest/bpm/wle/v1/exposed/process
     * 方法： GET
     * 状态： 200 - OK
     *
     * @param username
     * @param password
     * @return
     */
    String queryExposedProcess(String username, String password);

    /**
     * 完成当前节点，往下一节点扭转
     *
     * @param url           api的访问callURL
     * @param tkiid         任务标识:
     * @param requestMethod 请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username      用户名
     * @param password      密码
     * @param parameter     参数
     */
    String completeTask(String url, String tkiid, String requestMethod, String username, String password, String parameter);

    /**
     * 完成当前节点，往下一节点扭转
     * 请求： https://192.168.0.200:9443/rest/bpm/wle/v1/task/849?action=finish&parts=all
     * 方法： PUT
     * 状态： 200 - OK
     * 结果： 成功
     * {status: "200",
     * data: {...}
     * }
     * 结果：失败
     * {status: "error",
     * Data:{...}
     * }
     *
     * @param tkiid     任务标识:
     * @param username  用户名
     * @param password  密码
     * @param parameter 参数
     */
    String completeTask(String tkiid, String username, String password, String parameter);

    /**
     * 终止流程
     *
     * @param url           api的访问callURL
     * @param piid          流程实例标识:
     * @param requestMethod 请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username      用户名
     * @param password      密码
     */
    void terminateBPM(String url, String piid, String requestMethod, String username, String password);

    /**
     * 删除流程
     *
     * @param url           api的访问url
     * @param piid          流程实例标识:
     * @param requestMethod 请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username      用户名
     * @param password      密码
     */
    void deleteBPM(String url, String piid, String requestMethod, String username, String password);

    /**
     * 查询流程
     *
     * @param url                 api的访问callURL
     * @param queryName           查询名称:
     * @param selectedAttributes  所选属性:
     * @param interactionFilter   交互过滤器: (待办、已办等)：
     * @param queryFilter         查询过滤器:
     * @param searchFilter        搜索过滤器:
     * @param processAppName      流程应用程序名称:
     * @param sortAttributes      排序属性:
     * @param offset              偏移量:
     * @param size                大小:
     * @param filterByCurrentUser
     * @param requestMethod       请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username            用户名
     * @param password            密码
     */
    String queryBPM(String url, String queryName, String selectedAttributes, String interactionFilter, String queryFilter, String searchFilter, String processAppName,
                    String sortAttributes, String offset, String size, String filterByCurrentUser, String requestMethod, String username, String password);

    /**
     * 调用IBM BPM REST API
     *
     * @param urlString     api的访问url
     * @param requestMethod 请求的方式"GET"/"POST"/"PUT"/"DELETE"
     * @param username
     * @param password
     * @return json格式的字符串
     */
    String callRestAPI(String urlString, String requestMethod, String username, String password);

    /**
     * 查询待办任务
     * 访问url=http://192.168.0.200:9080/rest/bpm/wle/v1/tasks/query/IBM.DEFAULTALLTASKSLIST_75?interactionFilter=ASSESS_AND_WORK_ON&processAppName=%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E7%AE%A1%E7%90%86"
     * 访问带版本号的url=http://192.168.0.200:9080/rest/bpm/wle/v1/tasks/query/IBM.DEFAULTALLTASKSLIST_75?interactionFilter=ASSESS_AND_WORK_ON&queryFilter=SNAPSHOT_NAME='v1.3.1'&processAppName=%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E7%AE%A1%E7%90%86
     *
     * @param username 用户名
     * @param password 密码
     * @throws Exception
     */
    String queryToDoTask(String username, String password, String version) throws Exception;

    /**
     * @param piid    任务标识id
     * @param toUser  要分配的用户
     * @param toGroup 要分配的组
     * @return
     */
    String assignTask(String piid, String toUser, String toGroup, String uName, String pword);

    void  bpmDetail(Object record, String username, String password, Integer type)throws Exception;
}
